package com.pubinfo.passbook.common.model.shortMessage;

import cn.hutool.core.util.RandomUtil;
import com.pubinfo.passbook.common.model.bo.uccp.ShortMessageParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Data
public class ShortMessageBodyParam {
  @ApiModelProperty("请求流水号")
  /**
   * 必填
   * 请求流水号，
   * 格式应为6位的SystemCode+YYYYMMDDHH24MISS+10位的循环序列
   */
  private String TransactionId;
  
  @ApiModelProperty("外系统消息流水(查询发送结构)")
  /**
   * 非必填
   */
  private String ExtOrderId;
  
  @ApiModelProperty("定时发送时间")
  /**
   * 非必填
   * 格式：yyyy-mm-dd hh24:mi:ss
   */
  private String SendDate;
  
  @ApiModelProperty("接收消息推送的手机号码或者电子邮箱地址")
  /**
   * 必填
   */
  private String AccNbr;
  
  @ApiModelProperty("UCCP分配的认证密码")
  /**
   * 必填
   */
  private String Password;
  
  @ApiModelProperty("发送消息参数")
  /**
   * 非必填
   * 发送消息参数，当消息内容为空的时候，内容由UCCP完成，外系统只需要传关键信息即可，
   * 比如客户名称等，参数之间用“,”分割。
   * （如果参数内容中含有“，”则需要用“&comma;”代替逗号）
   */
  private String ContentParam;
  
  @ApiModelProperty("场景标识")
  /**
   * 必填
   * 场景标识，统一由UCCP分配
   */
  private String SceneId;
  
  @ApiModelProperty("UCCP分配的系统编码")
  /**
   * 必填
   * UCCP分配的系统编码
   */
  private String SystemCode;
  
  @ApiModelProperty("UCCP分配的帐号")
  /**
   * 必填
   * UCCP分配的帐号
   */
  private String UserAcct;
  
  @ApiModelProperty("消息内容")
  /**
   * 非必填
   * 消息内容
   */
  private String OrderContent;
  
  @ApiModelProperty("本地网/辖区")
  /**
   * 本地网/辖区
   * （AccNbr为电子邮件时，LanId可以为空；
   * 当AccNbr为手机号码时，LanId不能为空）
   */
  private String LanId;
  
  @ApiModelProperty("请求的时间")
  /**
   * 必填
   * 请求的时间
   * 格式：yyyy-mm-dd hh24:mi:ss
   */
  private String RequestTime;
  
  public ShortMessageBodyParam() {
    
  }
  
  public ShortMessageBodyParam(ShortMessageParam param) {
    //{"AccNbr":"17316902653","OrderContent":"我是铁旺","RequestTime":"2021-12-14 19:39:20","SystemCode":"EBRSYS","UserAcct":"EBRSYS","LanId":"319","Password":"211213","scene_id":"7707","SendDate":"","TransactionId":"EBRSYS202112141939119548848232"}
  
    SimpleDateFormat formatTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    SimpleDateFormat formatId = new SimpleDateFormat("yyyyMMddHHmmss");
    Date date = new Date();
    String code = "EBRSYS";
    this.RequestTime = formatTime.format(date);
    this.SystemCode = "EBRSYS";
    this.UserAcct = "EBRSYS";
    this.LanId = "571";
    this.Password = "211213";
    this.SceneId = "7707";
    this.SendDate = "";
    this.TransactionId = code + formatId.format(date) + RandomUtil.randomNumbers(10);
    this.AccNbr = param.getAccNbr();
    this.OrderContent = param.getOrderContent();
  }
  
  public Map<String, Object> toMap() throws IllegalAccessException {
    Map<String, Object> map = new HashMap<>();
    Class<?> clazz = this.getClass();
    for (Field field : clazz.getDeclaredFields()) {
      field.setAccessible(true);
      if (ObjectUtils.anyNotNull(field.get(this))) {
        map.put(field.getName(), field.get(this));
      }
    }
    return map;
  }
}
